main(){
    var p1 = Person();
    p1.eat();
    p1.drink();
    p1.breath();
    p1.sleep();

    var p2 = Star();
    p2.eat();
    p2.drink();
    p2.breath();
    p2.sleep();
}
// 为什么要有抽象类？
// 定义一个类，里面有哪些属性和方法是不确定的！
// 定义一个抽象类，用于要求这个类必须有什么基本的特性！
abstract class Base {
    // 抽象方法：只是定义了这个方法，并没有实现
    eat();
    drink();
    breath();
    // 具体方法：已经能调用实现的方法叫具体方法
    sleep(){
      print('我在睡觉');
    } 
}
abstract class Basic {
  sit();
}
// 我希望Person至少能吃饭喝水呼吸睡觉这些功能
// extends继承抽象类
class Person extends Base {
    // 如果一个类继承了抽象类，就必须实现里面的抽象方法
    eat(){
      print('我在吃饭');
    }
    drink(){
      print('我在喝水');
    }
    breath(){
      print('我在呼吸');
    }
    // sleep不需要实现，因为不是抽象方法，而且还可以继承过来
}
// implements实现一个或多个抽象类，即使抽象类已经实现了的方法也得进行实现
class Star implements Base,Basic{
    eat(){
      print('我在吃饭');
    }
    drink(){
      print('我在喝水');
    }
    breath(){
      print('我在呼吸');
    }
    sleep(){
      print('我在睡觉');
    }
    sit(){
      print('我在坐着');
    }
}

// 总结：
// abstract抽象类就是为了定义类的时候对类进行一些属性和方法的约束,要求这个类必须要包含一些属性和方法
// 实现抽象类有2种方法
// 1.通过extends进行继承，如果抽象类没实现，你继承就必须实现
// 2.通过implements进行实现，如果抽象类声明了方法，不论有没有实现，都必须再实现一次
